//import CryptoJS from 'crypto-js';
const CryptoJS = require('crypto-js')
const crypto = require('crypto');

module.exports = class Des {


  static md5(str) {
    return CryptoJS.MD5(str).toString();
  }

  /**
   * 加密方法
   * @param {string} clear 明文字符串
   * @param {string} key 密钥（可选，默认为"19881120"）
   * @returns {string} 加密后的十六进制字符串
   */
  static encrypt(clear, key = "19881120") {
    // 处理密钥长度，不足8字节时补全
    const processedKey = this._processKey(key);

    // 将明文按8字节块补全
    const paddedClearText = this._padText(clear);

    // 使用DES-ECB模式加密
    const encrypted = CryptoJS.DES.encrypt(
      CryptoJS.enc.Utf8.parse(paddedClearText),
      CryptoJS.enc.Utf8.parse(processedKey),
      {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.NoPadding
      }
    );

    // 转换为十六进制字符串
    return encrypted.ciphertext.toString(CryptoJS.enc.Hex).toUpperCase();
  }

  /**
   * 解密方法
   * @param {string} unclear 加密的十六进制字符串
   * @param {string} key 密钥（可选，默认为"19881120"）
   * @returns {string} 解密后的明文字符串
   */
  static decrypt(unclear, key = "19881120") {
    if (!unclear || unclear === "") return unclear;

    // 处理密钥长度
    const processedKey = this._processKey(key);

    // 将十六进制字符串转换为WordArray
    const cipherParams = CryptoJS.lib.CipherParams.create({
      ciphertext: CryptoJS.enc.Hex.parse(unclear)
    });

    // 使用DES-ECB模式解密
    const decrypted = CryptoJS.DES.decrypt(
      cipherParams,
      CryptoJS.enc.Utf8.parse(processedKey),
      {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.NoPadding
      }
    );

    // 转换为UTF-8字符串并去除填充
    const decryptedText = decrypted.toString(CryptoJS.enc.Utf8);
    return this._removePadding(decryptedText);
  }

  /**
   * Delphi兼容的加密方法
   * @param {string} clear 明文字符串
   * @param {string} key 密钥
   * @returns {string} 加密后的字符串
   */
  static delphiEncrypt(clear, key) {
    const encrypted = this.encrypt(clear, key);
    return encrypted.substring(1, encrypted.length - 16);
  }

  /**
   * Delphi兼容的解密方法
   * @param {string} unclear 加密字符串
   * @param {string} key 密钥
   * @returns {string} 解密后的明文字符串
   */
  static delphidecrypt(unclear, key) {
    const suffix = this.encrypt("1", key);
    const fullCiphertext = unclear + suffix.substring(suffix.length - 16);
    return this.decrypt(fullCiphertext, key);
  }

  /**
   * 处理密钥，确保长度为8字节
   * @param {string} key 原始密钥
   * @returns {string} 处理后的8字节密钥
   */
  static _processKey(key) {
    if (key.length < 8) {
      // 不足8字节时补零
      return key.padEnd(8, '\0');
    } else {
      // 截取前8字节
      return key.substring(0, 8);
    }
  }

  /**
   * 填充文本到8字节的倍数
   * @param {string} text 原始文本
   * @returns {string} 填充后的文本
   */
  static _padText(text) {
    const blockSize = 8;
    const padLength = blockSize - (text.length % blockSize);

    if (padLength === 0 || padLength === blockSize) {
      return text;
    }

    // 补零
    return text.padEnd(text.length + padLength, '\0');
  }

  /**
   * 移除填充的零
   * @param {string} text 带填充的文本
   * @returns {string} 移除填充后的文本
   */
  static _removePadding(text) {
    // 移除尾部的零
    return text.replace(/\0+$/, '');
  }
}


//console.log(Des.encrypt("Name:{3C60DD57-874E-4A36-86E4-CC60A4517503};Description:;Mac:00FF3C60DD57;IP:;Gateway:;GateMac:","4F420A92-6FD3-4644-ACB2-60A786B21979"))